package code15.io;

import java.awt.Color;
import java.awt.Font;
import java.awt.PopupMenu;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTextArea;
import javax.swing.UIManager;

public class MyFileEditTool {
	public static void main(String[] args) {
		MyFileEditTool t = new MyFileEditTool();
		t.show();
	}
	JFrame jt;
	JScrollPane pane;
	JTextArea textArea;
	
	JMenuBar menuBar;
	JMenu open;
	JMenu save;
	
	public void show() {
		init();
		bindEvent();
	}
	private void init() {
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (Exception e) {
			e.printStackTrace();
		}
		jt = new JFrame("File Edit");
		jt.setSize(300, 400);
		jt.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jt.setLocationRelativeTo(null);
		
		textArea = new JTextArea();
		textArea.setFont(new Font("宋体", Font.PLAIN, 20));
		textArea.setBackground(new Color(241, 241, 241));
		textArea.setLineWrap(true);
		
		pane = new JScrollPane(textArea);
		jt.add(pane);
		
		menuBar = new JMenuBar();
		open = new JMenu("open");
		save = new JMenu("save");

		JMenu test = new JMenu("test");
		JMenuItem ji1 = new JMenuItem("i1");
		JMenuItem ji2 = new JMenuItem("i2");
		JMenuItem ji3 = new JMenuItem("i3");
		JMenuItem ji4 = new JMenuItem("i4");
		ji1.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				Object source = e.getSource();
				if (source instanceof JMenuItem) {
					JMenuItem item = (JMenuItem) source;
					showMsg(item.getText());
				}
			}
		});
		test.add(ji1);
		test.add(ji2);
		test.addSeparator();
		test.add(ji3);
		test.add(ji4);
		
		menuBar.add(test);
		
		menuBar.add(open);
		menuBar.add(save);
		jt.setJMenuBar(menuBar);
		
		jt.setVisible(true);
	}
	private void bindEvent() {
		open.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				selectFile();
				if (null != filePath) {
					openFile();
				}
			}
		});
		save.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				saveFile();
			}
		});
	}
	private void showMsg(String msg) {
		JOptionPane.showMessageDialog(jt, msg, "tip", JOptionPane.INFORMATION_MESSAGE);
	}
	/**
	 * 在 编辑器中 显示文本文件内容
	 * @param fileContent 文本文件内容
	 */
	private void showContent(String fileContent) {
		textArea.setText(fileContent);
	}
	/**
	 * 获取编辑器中的内容
	 * @return
	 */
	private String getContent() {
		return textArea.getText();
	}
	/**
	 * 把编辑器内容保存到新的文件中, 
	 * 会把新文件的路径保存到 filePath 属性中
	 */
	private void selectFile() {
		JFileChooser jfc = new JFileChooser();
		int showOpenDialog = jfc.showOpenDialog(jt);
		if(showOpenDialog == JFileChooser.APPROVE_OPTION) {
			File selectedFile = jfc.getSelectedFile();
			filePath = selectedFile.getAbsolutePath();
		}
	}
	/**
	 * 打开的文件路径
	 */
	private String filePath;
	/**
	 * 打开文件内容
	 */
	private void openFile() {
		// 读取文件内容, 一次性传入 showContent 方法
		// 示例代码:
		StringBuffer buffer = new StringBuffer();
//		for (int i = 0; i < 30; i++) {
//			buffer.append(Math.random()).append('\n');
//		}
		File f = new File(filePath);
		try (
				BufferedReader br = new BufferedReader(
						new InputStreamReader(
								new FileInputStream(f), "UTF-8"));
				) {
			
			String line = null;
			while ( (line = br.readLine()) != null) {
				buffer.append(line);
				buffer.append('\n');
			}
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		// 显示文件内容
		showContent(buffer.toString());
		// 操作提示
		showMsg("成功打开文件:" + f.getName());
	}
	/**
	 * 保存文件内容
	 */
	private void saveFile() {
		// 获取编辑器中的内容
		String content = getContent();
		if (null == filePath) {
			// 进行保存操作, 将文件保存在 filePath 对应的文件中, 
			// 如果 filePath 为 null, 则 调用 selectFile(), 让用户自己指定文件的位置和名称
			// 如果 用户未指定, 则 filePath 依然会为 null。
			selectFile();
		}
		if (null != filePath) {
			// 保存内容到指定位置
			File f = new File(filePath);
			
			try (
					PrintWriter pw = new PrintWriter(f, "UTF-8");
					) {
				pw.print(content);
				pw.flush();
				// 保存成功给予提示
				showMsg("文件保存在:" + f.getName());
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		}
	}
}
